package dao.jdbc.SqlServer;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;

import dao.intefaces.InterfaceInformeServicioTecnicoDAO;
import entidades.InformeServicioTecnico;
import entidades.itemServicioTecnico;

public class InformeServicioTecnicoDAO implements InterfaceInformeServicioTecnicoDAO {
	
	// Singleton
	private static InformeServicioTecnicoDAO instancia = null;

	public static InformeServicioTecnicoDAO getInstancia(){
		if (instancia == null){
			instancia = new InformeServicioTecnicoDAO();
		}
		return instancia;
	}

	
	// METODOS

	@Override
	public Vector<String> obtenerTiposServicio() {
		// TODO Auto-generated method stub
		Vector<String> listadoTiposServicio = new Vector<String>();
		String tipoServicio;
		PreparedStatement stmt = null;
		ResultSet resultSet = null;
		try{
			Connection conexion = DataSource.obtenerConexion();
			String query = "SELECT * FROM categoriaInformeItem";
			stmt = conexion.prepareStatement(query);
			resultSet = stmt.executeQuery();
			while (resultSet.next()){
				tipoServicio = resultSet.getString("descripcion");
				listadoTiposServicio.add(tipoServicio);
			}
		}catch(Exception e){
			e.printStackTrace();			
		}finally{
			DataSource.cerrarConexion(resultSet, stmt);
		}
		return listadoTiposServicio;
	}


	@Override
	public boolean existeIST(int numeroInformeServicioTecnico) {
		// TODO Auto-generated method stub
		boolean resultadoOperacion = false;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try{
			Connection con = DataSource.obtenerConexion();
			String query = "SELECT * FROM informeServicioTecnico WHERE nroInforme = " + numeroInformeServicioTecnico;
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()){
				resultadoOperacion = true;
			}
		} catch(Exception e){
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return resultadoOperacion;
	}


	@Override
	public boolean guardarNuevoIST(InformeServicioTecnico nuevoInforme) {
		// TODO Auto-generated method stub
		PreparedStatement stmt = null;
		boolean resultadoOperacion = false;
		try{
			@SuppressWarnings("deprecation")
			String query = "INSERT INTO informeServicioTecnico VALUES (?,?,?,?,?,?, '" + nuevoInforme.getFecha().getTime().toLocaleString() +"')";
			Connection conexion = DataSource.obtenerConexion();
			conexion.setAutoCommit(false);
			stmt = conexion.prepareStatement(query);
			stmt.setInt(1, nuevoInforme.getNroDocumento());
			stmt.setString(2, nuevoInforme.getCliente().getCuit());
			stmt.setString(3, nuevoInforme.getContacto());
			stmt.setInt(4, nuevoInforme.getTotalHorasTraslado());
			stmt.setInt(5, nuevoInforme.getTotalHorasService());
			stmt.setString(6, null);
			stmt.execute();
			conexion.commit();
		}catch(Exception e){
			DataSource.rollback();
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(stmt);
			resultadoOperacion = true;
		}
		actualizarPrecioItem(nuevoInforme);
		agregarItemsInformeServicioTecnico(nuevoInforme);
		return resultadoOperacion;
	}


	private void actualizarPrecioItem(InformeServicioTecnico nuevoInforme) {
		// TODO Auto-generated method stub
		PreparedStatement stmt = null;
		try{
			Connection conexion = DataSource.obtenerConexion();
			String query = "update precioItem set nroInformeServicioTecnico = " + nuevoInforme.getNroDocumento() +
					"where nroPresupuesto = " + nuevoInforme.getNroPResupuesto();
			conexion.setAutoCommit(false);
			stmt = conexion.prepareStatement(query);
			stmt.execute();
			conexion.commit();
		}catch(Exception e){
			DataSource.rollback();
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(stmt);
		}
	}


	private void agregarItemsInformeServicioTecnico(InformeServicioTecnico informeServicioTecnico) {
		// TODO Auto-generated method stub
		Vector<itemServicioTecnico> listadoItems = informeServicioTecnico.getListadoItems();
		PreparedStatement stmt = null;
		try{
			for(int i = 0; i < listadoItems.size(); i++){
				String query = "INSERT INTO informeItem VALUES (?,?,?,?,?,?,?,?)";
				Connection conexion = DataSource.obtenerConexion();
				conexion.setAutoCommit(false);
				stmt = conexion.prepareStatement(query);
				stmt.setInt(1, listadoItems.elementAt(i).getNroItem());
				stmt.setInt(2, informeServicioTecnico.getNroDocumento());
				stmt.setInt(3, getNroCategoria(listadoItems.elementAt(i).getTipoServicio()));
				stmt.setString(4, listadoItems.elementAt(i).getNombreEquipo());
				stmt.setString(5, listadoItems.elementAt(i).getNroSerieEquipo());
				stmt.setString(6, listadoItems.elementAt(i).getProblemaEncontrado());
				stmt.setString(7, listadoItems.elementAt(i).getTipoServicio());
				stmt.setString(8, listadoItems.elementAt(i).getInstruccionesCliente());
				stmt.execute();
				conexion.commit();
			}
		}catch(Exception e){
			DataSource.rollback();
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(stmt);
		}
	}


	private int getNroCategoria(String tipoServicio) {
		// TODO Auto-generated method stub
		int nroTipoServicio = 0;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT nroCategoria FROM categoriaInformeItem WHERE DESCRIPCION = '" + tipoServicio + "';";
			Connection con = DataSource.obtenerConexion();
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);
			while (rs.next()) {
				nroTipoServicio = rs.getInt("nroCategoria");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return nroTipoServicio;
	}
	
}
